home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_200
/
248_01
/
common.c
< prev
next >
Wrap
Text File
|
1989-08-16
|
3KB
|
140 lines
/* COMMON: Most Common word processing for MicroSPELL 1.0
Spell Checker and Corrector
(C)opyright May 1987 by Daniel Lawrence
All Rights Reserved
*/
#include <stdio.h>
#include "dopt.h"
#include "dstruct.h"
#include "ddef.h"
loadcom() /* load the most used words in to the common list */
{
register char *sp; /* temp string pointer */
register int i; /* index */
FILE *cf; /* ptr to common word list file */
char buf[NSTRING+1]; /* buffer to hold current word */
/* if we are already loaded....don't bother again */
if (commonf == TRUE)
return(TRUE);
/* try to open it.... */
if ((cf = popen(comlist)) == NULL)
return(FALSE);
/* and load them up */
commonf = TRUE;
while (numcom < MAXCOM) {
/* get the next word */
if (fgets(buf, NSTRING, cf) == NULL)
break;
buf[strlen(buf)-1] = 0; /* get rid of the newline */
/* get room for it...*/
if ((sp = malloc(strlen(buf)+1)) == NULL) {
fclose(cf);
return(FALSE);
}
/* and store it */
strcpy(sp, buf);
cword[numcom++] = sp;
}
fclose(cf);
if (swdebug)
printf("[%u common words loaded]\n", numcom);
numfiltr = numcom;
return(TRUE);
}
dumpcom() /* unload the common word list */
{
/* only bother if we are really here */
if (commonf == FALSE)
return(TRUE);
/* dump them */
while (numfiltr--)
free(cword[numcom]);
if (swdebug)
printf("[common word list dumped]");
return(TRUE);
}
iscom(word) /* is a word in the common/user word list? */
char *word; /* word to check */
{
register int lower; /* lower limit for search */
register int upper; /* upper limit for search */
register int mid; /* current word in search */
register int cresult; /* result of current compare */
register char *tp; /* temp string pointer */
static char tword[NSTRING]; /* temp copy of word */
/* set up limits */
lower = 0;
upper = numfiltr - 1;
/* Binary search the list */
while (upper >= lower) {
/* find the current mid item */
mid = (upper + lower) / 2;
/* compare it */
cresult = strcmp(word, cword[mid]);
if (cresult == 0) /* success!!!! */
return(TRUE);
/* reset the search bounds */
if (cresult > 0)
lower = mid + 1;
else
upper = mid - 1;
}
/* we haven't found it... try lowercasing it */
if (islower(*word))
goto fail;
tp = tword;
while (*word)
if (isupper(*word))
*tp++ = *word++ + DIFCASE;
else
*tp++ = *word++;
*tp = 0;
/* set up limits */
lower = 0;
upper = numfiltr - 1;
/* Binary search the list */
while (upper >= lower) {
/* find the current mid item */
mid = (upper + lower) / 2;
/* compare it */
cresult = strcmp(tword, cword[mid]);
if (cresult == 0) /* success!!!! */
return(TRUE);
/* reset the search bounds */
if (cresult > 0)
lower = mid + 1;
else
upper = mid - 1;
}
fail: /* it's not here, jim.... */
return(FALSE);
}